package service

import (
	"errors"
	"fmt"
	models "image-server/dao"
	"image-server/dao/model"
)

// 错误定义（统一错误类型）
var (
	ErrAlbumNotFound = errors.New("相册不存在")
	ErrUnauthorized  = errors.New("无权访问")
	ErrInvalidParams = errors.New("参数无效")
)

// ParseError 转换错误为用户友好信息
func ParseError(err error) string {
	switch {
	case errors.Is(err, ErrAlbumNotFound):
		return "相册不存在"
	case errors.Is(err, ErrUnauthorized):
		return "无权访问"
	case errors.Is(err, ErrInvalidParams):
		return "参数无效"
	default:
		return "操作失败，请重试" // 隐藏系统错误详情
	}
}

// AlbumService 相册服务层，处理相册相关业务逻辑
type AlbumService struct{}

// CreateAlbum 创建相册
func (s *AlbumService) CreateAlbum(user *model.User, name string, description string, isPublic bool) (*model.Album, error) {
	// 1. 验证参数
	if name == "" {
		return nil, ErrInvalidParams
	}

	// 2. 组装相册信息
	album := &model.Album{
		UserID:      user.ID,
		Name:        name,
		Description: description,
		IsPublic:    isPublic,
	}

	// 3. 调用模型层创建相册
	albumID, err := models.CreateAlbum(user.ID, user.WpsUID, album)
	if err != nil {
		return nil, fmt.Errorf("创建相册失败: %w", err)
	}

	// 4. 返回创建的相册详情
	return models.GetAlbumByID(albumID)
}

// GetAlbumByID 获取相册详情（带权限校验）
func (s *AlbumService) GetAlbumByID(albumID, userID int64) (*model.Album, error) {
	// 1. 查询相册信息
	album, err := models.GetAlbumByID(albumID)
	if err != nil {
		return nil, ErrAlbumNotFound
	}

	// 2. 权限校验：私有相册只能被所有者访问
	if !album.IsPublic && album.UserID != userID {
		return nil, ErrUnauthorized
	}

	return album, nil
}

// DeleteAlbum 删除相册
func (s *AlbumService) DeleteAlbum(albumID, userID int64) error {
	// 1. 调用模型层删除相册
	if err := models.DeleteAlbumByID(albumID, userID); err != nil {
		// 2. 错误处理
		if errors.Is(err, ErrUnauthorized) {
			return ErrUnauthorized
		}
		return ErrAlbumNotFound
	}
	return nil
}

// GetUserAlbums 获取用户相册列表（分页）
func (s *AlbumService) GetUserAlbums(userID int64, page, limit int) ([]model.Album, int64, error) {
	// 1. 处理分页参数
	if page < 1 {
		page = 1
	}
	if limit < 1 || limit > 50 {
		limit = 10
	}

	// 2. 调用模型层查询相册列表
	return models.GetAlbumsByUserID(userID, page, limit)
}

// UpdateAlbum 更新相册
func (s *AlbumService) UpdateAlbum(albumID, userID int64, wpsID string, name *string, isPublic *bool) (*model.Album, error) {
	// 1. 查询相册信息
	album, err := models.GetAlbumByID(albumID)
	if err != nil {
		return nil, ErrAlbumNotFound
	}

	// 2. 权限校验
	if album.UserID != userID {
		return nil, ErrUnauthorized
	}

	// 3. 更新字段（仅更新非空参数）
	if name != nil && *name != "" {
		album.Name = *name
	}
	if isPublic != nil {
		album.IsPublic = *isPublic
	}

	// 4. 调用模型层执行更新
	if err := models.UpdateAlbum(album, wpsID); err != nil {
		return nil, fmt.Errorf("更新相册失败: %w", err)
	}

	// 5. 返回更新后的相册信息
	return models.GetAlbumByID(albumID)
}

// GetPublicAlbumsByUserID 查询指定用户的公开相册
func (s *AlbumService) GetPublicAlbumsByUserID(targetUserID int64, page, limit int) ([]model.Album, int64, error) {
	// 1. 校验分页参数
	if page < 1 {
		page = 1
	}
	if limit < 1 || limit > 50 {
		limit = 10
	}

	// 2. 调用模型层查询公开相册
	return models.GetPublicAlbumsByUserID(targetUserID, page, limit)
}
